﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using JasRibbonApplicatie.Classes;
using System.Reflection;
using JasRibbonApplicatie.Model;



namespace JasRibbonApplicatie.Views.BeheerAanvragen
{
    /// <summary>
    /// Interaction logic for OverzichtAanvragen.xaml
    /// </summary>
    public partial class OverzichtAanvragen : Page
    {
        const string STANDAARD_UUR = "19:00";

        private List<Aanvraag> Aanvragenlijst = null;
        internal Aanvraag selectedAanvraag = null;
        private List<Magazijnier> ActieveMagazijniers = null;
        private List<Status> statusFilters = new List<Status>();
        private Login login=null;
        private MainWindow mainWindowReference = null;
        private static GebruikerModel gm = new GebruikerModel();
        private static AanvraagModel am = new AanvraagModel();

        public OverzichtAanvragen()
        {
            InitializeComponent();

            login = Login.Instance;
            mainWindowReference = login.MainWindowReference;
            mainWindowReference.AanvragenToolsGroup.Visibility = Visibility.Collapsed;
            mainWindowReference.MailToolsGroup.Visibility = Visibility.Collapsed;
            mainWindowReference.AanvragenSelectieGroup.Visibility = Visibility.Visible;

            ActieveMagazijniers = gm.GetAllMagazijniers();
            afhalenMagazijnierComboBox.ItemsSource = ActieveMagazijniers;
            inleverenMagazijnierComboBox.ItemsSource = ActieveMagazijniers;

            afhalenDatePicker.SelectedDate = null;
            inleverenDatePicker.SelectedDate = null;

            UIHelpers.timePickerComboBoxOpvullen(afhalenTijdComboBox);
            UIHelpers.timePickerComboBoxOpvullen(inleverenTijdComboBox);
            afhalenTijdComboBox.SelectedItem = STANDAARD_UUR;
            inleverenTijdComboBox.SelectedItem = STANDAARD_UUR;
            
            getAanvragen();
            InitializeMateriaalBeheerShownColumns();
        }

        private void InitializeMateriaalBeheerShownColumns()
        {
            UserData ud = login.UserData;
            if (ud.MateriaalBeheerShownColumns == null || ud.MateriaalBeheerShownColumns.Count == 0)
            {
                ud.MateriaalBeheerShownColumns = new List<String>();
                foreach (var col in aanvragenDatagrid.Columns)
                {
                    if (col.Header.ToString() != "")
                    {
                        ud.MateriaalBeheerShownColumns.Add(col.Header.ToString());
                    }
                    else
                    {
                        ud.MateriaalBeheerShownColumns.Add("Status");
                    }
                }
            }

            foreach (var col in aanvragenDatagrid.Columns)
            {
                if(ud.MateriaalBeheerShownColumns.Contains(col.Header.ToString()) ||
                   (col.Header.ToString() == "" && ud.MateriaalBeheerShownColumns.Contains("Status")))
                {
                    showHideColumn(col.Header.ToString(), Visibility.Visible);
                }
                else
                {
                    showHideColumn(col.Header.ToString(), Visibility.Collapsed);
                }
            }
        }

        private void getAanvragen()
        {
            int selectedIndex = aanvragenDatagrid.SelectedIndex;
            if (selectedIndex == -1) OntleningDetailsWrapPanel.Visibility = Visibility.Collapsed;

            Aanvragenlijst = am.GetAanvragen(statusFilters);
            aanvragenDatagrid.ItemsSource = Aanvragenlijst;
            aanvragenDatagrid.SelectedIndex = selectedIndex;
        }

        private void aanvragenDatagrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
            DataGrid dg = sender as DataGrid;
            Aanvraag aanvraag = dg.SelectedItem as Aanvraag;
            mainWindowReference.AanvragenToolsGroup.Visibility = Visibility.Collapsed;
            if (aanvraag != null)
            {
                if (selectedAanvraag == null || aanvraag.aanvraag_id != selectedAanvraag.aanvraag_id)
                {
                    showDetails(aanvraag);
                    OntleningDetailsWrapPanel.Visibility = Visibility.Visible;
                    selectedAanvraag = aanvraag;

                    mainWindowReference.AanvragenToolsGroup.Visibility = Visibility.Visible;
                }
            }
        }
        internal void showDetails(Aanvraag aanvraag)
        {
            
            
            OntleningDetailsWrapPanel.DataContext = aanvraag;
            

            #region Autoset GeplandeAfhaling
            if (aanvraag.geplande_afhaling != null)
            {
                afhalenDatePicker.SelectedDate = aanvraag.geplande_afhaling;
            }
            else
            {
                DateTime start =aanvraag.evenement.start;
                switch (start.DayOfWeek){
                    case DayOfWeek.Monday:
                        afhalenDatePicker.SelectedDate = start.AddDays(-1);
                        break;
                    case DayOfWeek.Tuesday:
                        afhalenDatePicker.SelectedDate = start.AddDays(-2);
                        break;
                    case DayOfWeek.Wednesday:
                        afhalenDatePicker.SelectedDate = start.AddDays(-3);
                        break;
                    case DayOfWeek.Thursday:
                        afhalenDatePicker.SelectedDate = start.AddDays(-4);
                        break;
                    case DayOfWeek.Friday:
                        if(start.TimeOfDay > new TimeSpan(19, 30, 0))
                            afhalenDatePicker.SelectedDate = start.Date;
                        else afhalenDatePicker.SelectedDate = start.AddDays(-5);
                        break;
                    case DayOfWeek.Saturday:
                        afhalenDatePicker.SelectedDate = start.AddDays(-1);
                        break;
                    case DayOfWeek.Sunday:
                        if(start.TimeOfDay < new TimeSpan(19, 30, 0))
                            afhalenDatePicker.SelectedDate = start.AddDays(-2);
                        else afhalenDatePicker.SelectedDate = start.Date;
                        break;
                }
                //afhalenDatePicker.SetValue(DatePicker.BackgroundProperty,Colors.Gray);
            }
            #endregion

            #region Autoset GeplandeInlevering
            if (aanvraag.geplande_inlevering != null)
            {
                inleverenDatePicker.SelectedDate = aanvraag.geplande_inlevering;
            }
            else
            {
                DateTime einde = aanvraag.evenement.einde;
                switch (einde.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        inleverenDatePicker.SelectedDate = einde.AddDays(4);
                        break;
                    case DayOfWeek.Tuesday:
                        inleverenDatePicker.SelectedDate = einde.AddDays(3);
                        break;
                    case DayOfWeek.Wednesday:
                        inleverenDatePicker.SelectedDate = einde.AddDays(2);
                        break;
                    case DayOfWeek.Thursday:
                        inleverenDatePicker.SelectedDate = einde.AddDays(1);
                        break;
                    case DayOfWeek.Friday:
                        if (einde.TimeOfDay > new TimeSpan(18, 30, 0))
                            inleverenDatePicker.SelectedDate = einde.AddDays(2);
                        else inleverenDatePicker.SelectedDate = einde.Date;
                        break;
                    case DayOfWeek.Saturday:
                        inleverenDatePicker.SelectedDate = einde.AddDays(1);
                        break;
                    case DayOfWeek.Sunday:
                        if (einde.TimeOfDay < new TimeSpan(18, 30, 0))
                            inleverenDatePicker.SelectedDate = einde.Date;
                        else inleverenDatePicker.SelectedDate = einde.AddDays(5);
                        break;
                }
                inleverenDatePicker.Background = new BrushConverter().ConvertFromString("#FFAAF3A0") as Brush;
            }
            #endregion

            

            if (aanvraag.magazijnierAfhaling != null)
            {
                foreach(var item in afhalenMagazijnierComboBox.Items)
                    if((item as Magazijnier).magazijnier_id == aanvraag.magazijnierAfhaling.magazijnier_id)
                        afhalenMagazijnierComboBox.SelectedItem = item;
            }

            /*
            foreach (var item in afhalenMagazijnierComboBox.Items)
            {
                Magazijnier mag = Queries.getMagazijnierForDate(afhalenDatePicker.SelectedDate);
                if (mag != null && (item as Magazijnier).MagazijnierId == mag.MagazijnierId)
                {
                        
                    //afhalenMagazijnierComboBox.SelectedItem = item;
                }
            }
            }*/
            

            if (aanvraag.magazijnierInlevering != null)
            {
                foreach (var item in inleverenMagazijnierComboBox.Items)
                    if ((item as Magazijnier).magazijnier_id == aanvraag.magazijnierInlevering.magazijnier_id)
                        inleverenMagazijnierComboBox.SelectedItem = item;
            }

            /*
            foreach (var item in inleverenMagazijnierComboBox.Items)
            {
                Magazijnier mag = Queries.getMagazijnierForDate(inleverenDatePicker.SelectedDate);
                if (mag != null && (item as Magazijnier).MagazijnierId == mag.MagazijnierId)
                    inleverenMagazijnierComboBox.SelectedItem = item;
            }
            */

            

        }

        private void aanvragenDatagrid_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            //search the object hierarchy for a datagrid row
            DependencyObject source = (DependencyObject) e.OriginalSource;
            var row = UIHelpers.TryFindParent<DataGridRow>(source);

            if (row != null) return;
            ContextMenu menu = new ContextMenu();


            foreach (var col in aanvragenDatagrid.Columns)
            {
                MenuItem item = new MenuItem();
                item.Header = (col.Header.ToString() != "") ? col.Header : "Status";
                if (col.Visibility == Visibility.Visible)
                {
                    Image icon = new Image();
                    icon.Source = new ImageSourceConverter().ConvertFromString("pack://application:,,,/JasRibbonApplicatie;component/Images/vinkje.png") as ImageSource;
                    icon.MaxWidth = 15;
                    item.Icon = icon;
                    
                    item.Click += new RoutedEventHandler((itemSender, itemArgs) =>
                    {
                        showHideColumn(((MenuItem)itemSender).Header.ToString(), Visibility.Collapsed);

                    });
                }
                else
                {
                    item.Click += new RoutedEventHandler((itemSender, itemArgs) =>
                    {
                        showHideColumn(((MenuItem)itemSender).Header.ToString(), Visibility.Visible);
                    });
                }
                menu.Items.Add(item);
            }
            aanvragenDatagrid.ContextMenu = menu;

            menu.PlacementTarget = this;
            menu.IsOpen = true;
            e.Handled = true;

            /*
            //the user did not click on a row
            if (row == null) return;

            //[insert great code here...]
            BeheerAanvraagMateriaalWindow bamw = new BeheerAanvraagMateriaalWindow(row.Item as Aanvraag);
            bamw.ShowDialog();
            e.Handled = true;*/
        }
        private void showHideColumn(String columnHeader, Visibility visibility)
        {
            if (columnHeader == "Status") columnHeader = "";
            foreach (var col in aanvragenDatagrid.Columns)
                if (col.Header.ToString() == columnHeader) col.Visibility = visibility;
            if (visibility == Visibility.Collapsed)
                if(login.UserData.MateriaalBeheerShownColumns.Contains(columnHeader))
                    login.UserData.MateriaalBeheerShownColumns.Remove(columnHeader);
            else
                if(!login.UserData.MateriaalBeheerShownColumns.Contains(columnHeader))
                    login.UserData.MateriaalBeheerShownColumns.Add(columnHeader);  
        }

        private void statusMenuItem_Click(object sender, RoutedEventArgs e)
        {
            MenuItem item = sender as MenuItem;
            Status s = null;
            try
            {
                s = am.getStatus(item.Header.ToString().ToLower());
            }
            finally
            {
                if(s!=null)
                    (aanvragenDatagrid.SelectedItem as Aanvraag).status = s;
            }
            aanvragenDatagrid.Items.Refresh();
        }

        internal void afhalenMagazijnierComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cb = sender as ComboBox;
            Aanvraag av = aanvragenDatagrid.SelectedItem as Aanvraag;
            if (av != null && cb.SelectedItem != null)
            {
                am.SetAfhalenMagazijnier(av.aanvraag_id, (cb.SelectedItem as Magazijnier).magazijnier_id);
                getAanvragen();
            }
        }
        internal void inleverenMagazijnierComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cb = sender as ComboBox;
            Aanvraag av = aanvragenDatagrid.SelectedItem as Aanvraag;
            if (av != null)
            {
                am.SetInleverenMagazijnier(av.aanvraag_id, (cb.SelectedItem as Magazijnier).magazijnier_id);
                getAanvragen();
            }
        }

        internal void afhalenDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (afhalenDatePicker.SelectedDate != null)
            {
                DateTime d = afhalenDatePicker.SelectedDate.Value;
                String[] t = (afhalenTijdComboBox.SelectedItem.ToString()).Split(':');

                Aanvraag av = aanvragenDatagrid.SelectedItem as Aanvraag;
                if (av != null && t.Count() == 2)
                {
                    am.SetAfhalenTijd(av.aanvraag_id, new DateTime(d.Year, d.Month, d.Day, int.Parse(t[0]), int.Parse(t[1]), 0));
                    getAanvragen();
                }
                
            }

            afhalenMagazijnierComboBox.ItemsSource = ActieveMagazijniers.ToList();

        }
        internal void inleverenDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (afhalenDatePicker.SelectedDate != null)
            {
                DateTime d = inleverenDatePicker.SelectedDate.Value;
                String[] t = (inleverenTijdComboBox.SelectedItem.ToString()).Split(':');

                Aanvraag av = aanvragenDatagrid.SelectedItem as Aanvraag;
                if (av != null && t.Count() == 2)
                {
                    am.SetInleverenTijd(av.aanvraag_id, new DateTime(d.Year, d.Month, d.Day, int.Parse(t[0]), int.Parse(t[1]), 0));
                    getAanvragen();
                }
            }
        }

        internal void afhalenTijdComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            afhalenDatePicker_SelectedDateChanged(afhalenDatePicker,e);
        }
        internal void inleverenTijdComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            inleverenDatePicker_SelectedDateChanged(inleverenDatePicker, e);
        }

        internal void addToStatusFilter(Status status)
        {
            statusFilters.Add(status);
            getAanvragen();
        }
        internal void RemoveFromStatusFilter(Status status)
        {
            statusFilters.Remove(status);
            getAanvragen();
        }

        private void OverzichtAanvragenPage_Unloaded(object sender, RoutedEventArgs e)
        {
            am.OpslaanWijzigingen(false);
            gm.OpslaanWijzigingen(false);
        }
    }
}
